package dynamic_demo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理类
 * <p>
 * 通过 DynamicProxy 类去包装HelloImpl实例，然后JDK给我们提供的Proxy类的工厂方法
 * newProxyInstance去动态创建一个Hello接口的代理类，最后调用这个代理类的say方法
 * <p>
 * 这种方式的缺点：
 * 1.方法每次都需要传三个参数，比较繁琐；
 * 2.调用玩还需要类型强转
 * <p>
 * 重构一下这个动态代理类 -》  BetterDynamicProxy
 *
 * @Author: Crystal
 * @Date: 2018/11/28 16:13
 **/
public class DynamicProxy implements InvocationHandler {

    private Object target;

    public DynamicProxy(Object target) {
        this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result = method.invoke(target, args);
        after();
        return result;
    }

    private void before() {
        System.out.println("##### Before ######");
    }

    private void after() {
        System.out.println("##### After ######");
    }

    public static void main(String[] args) {
        Hello hello = new HelloImpl();

        DynamicProxy dynamicProxy = new DynamicProxy(hello);

        Hello helloProxy = (Hello) Proxy.newProxyInstance(
                hello.getClass().getClassLoader(),
                hello.getClass().getInterfaces(),
                dynamicProxy
        );

        helloProxy.say("Dynamic Cyy Proxy");

    }
}
